#ifndef GAME_INTRINSICTS_H
#define GAME_INTRINSICTS_H
#include <cmath>
#include "game_platform.h"

// 之后会将所有这些函数转换为平台高效版本，并移除 `math.h`。

// Signof函数：根据输入值返回符号（正数返回1，负数返回-1）
inline int32 Signof(int32 Value) {
    // 如果Value大于等于0，返回1，否则返回-1
    int32 Result = (Value >= 0) ? 1 : -1;
    // 返回计算的符号结果
    return Result;
}

inline real32 SignOf(real32 Value) {
    real32 Result = (Value >= 0) ? 1.0f : -1.0f;
    return Result;
}

/**
 * @brief 对 32 位无符号整数执行左循环位移。
 * @return uint32 返回左循环位移后的结果。
 */
inline uint32 RotateLeft(uint32 Value, int32 Amount) {
#if COMPILER_MSVC
    // 使用内置函数 _rotl 高效地执行左循环移位。
    uint32 Result = _rotl(Value, Amount);

#else
    Amount &= 31;
    uin32 Result = ((value >> Amount) | (value << (32 - Amount)));
#endif
    // 返回循环移位的结果。
    return Result;
}

// 定义一个内联函数，用于计算实数的绝对值
inline real32 AbsoluteValue(real32 Real32) {
    // 调用标准数学库函数 `fabs`，计算输入实数的绝对值
    // `fabs` 函数会返回去掉符号位后的数值，确保返回值为正数或零
    real32 Result = fabs(Real32);

    // 返回计算结果
    return Result;
}

inline int32 RoundReal32ToInt32(real32 Real32) {
    // 加上0.5以确保实现标准舍入逻辑
    int32 Result = (int32)roundf(Real32);

    // 返回舍入后的整数结果
    return Result;
}

//    返回四舍五入后的无符号整数（uint32）。
inline uint32 RoundReal32ToUInt32(real32 Real32) {
    // 使用 roundf 函数四舍五入 Real32，并将结果强制转换为无符号整数（uint32）
    uint32 Result = (uint32)roundf(Real32);

    // 返回四舍五入后的结果
    return Result;
}

// 将浮动点数（real32）截断并转换为32位无符号整数（uint32）
inline uint32 TruncateReal32ToUInt32(real32 Real32) {
    // 将浮动点数直接转换为无符号整数，去掉小数部分
    // 这只是简单的截断操作，没有进行四舍五入
    uint32 Result = (uint32)Real32;  // 截断浮动点数，丢弃小数部分
    return Result;                   // 返回转换后的无符号整数
}

// 返回将输入浮点数向下取整后的整数值（int32）。
inline int32 FloorReal32ToInt32(real32 Real32) {
    // 使用 floor 函数将 Real32 向下取整并转换为 int32 类型
    int32 Result = (int32)floor(Real32);
    // 返回转换后的整数值
    return Result;
}

// CeilReal32ToInt32: 将一个32位浮点数转换为整数，
// 该函数通过对输入的浮点数进行向上取整（ceiling）操作来实现。
// 取整的结果是大于或等于该浮点数的最小整数值。
inline int32 CeilReal32ToInt32(real32 Real32) {
    // 使用标准库的ceil函数将浮点数向上取整
    int32 Result = (int32)ceil(Real32);

    // 返回取整后的整数值
    return Result;
}

// 计算给定角度的正弦值
inline real32 Sin(real32 Angle) {
    // 使用标准库函数 sinf 来计算正弦值
    real32 Result = sinf(Angle);
    return Result;
}

// 计算给定角度的余弦值
inline real32 Cos(real32 Angle) {
    // 使用标准库函数 cosf 来计算余弦值
    real32 Result = cosf(Angle);
    return Result;
}

// 计算 (X, Y) 坐标点的反正切值，返回值在 [-π, π] 范围内
inline real32 ATan2(real32 X, real32 Y) {
    // 使用标准库函数 atan2 来计算反正切值
    real32 Result = atan2(X, Y);
    return Result;
}
#endif